/**
 * 启动模式
 *
 * 懒汉式（Lazy Initialization）：如果没有侦听事件，会清除定时任务
 * 饿汉式（Eager Initialization）：始终保持定时任务，用在弹窗较多的场景
 */
type Mode = 'Lazy' | 'Eager';

class WorkTask {

    /**
     * 启动模式
     */
    private mode: Mode;

    /** 需要处理的回调函数列表 */
    private events: Function[] = [];
    /** 定时 ID */
    private interval: number = undefined;

    /**
     * 设置启动模式
     * @param mode 启动模式
     */
    constructor(mode: Mode = "Lazy") {
        this.mode = mode;
    }

    /**
     * 触发所有的事件
     */
    trigger() {
        this.events.forEach(e => e());
    }

    /**
     * 启动侦听线程
     */
    startWorkTask() {
        // add interval
        if (this.interval == null) {
            const my = this;
            this.interval = window.setInterval(()=>{
                my.trigger();
            }, 10);
        }
    }

    /**
     * 关闭侦听线程
     */
    clearWorkTask() {
        // clear interval
        window.clearInterval(interval);
        this.interval = null;

        // 清除所有元素
        this.events.length = 0;
    }

    /**
     * 添加一个侦听事件
     *
     * @param evt -
     */
    addListener(evt: Function) {
        this.startWorkTask();
        this.events.push(evt);
    }

    /**
     * 移除一个侦听事件
     *
     * @param evt -
     */
    removeListener(evt: Function) {
        const idx = this.events.indexOf(evt);
        if (idx >= 0) {
            this.events.splice(idx, 1);

            // 没有任何任务的时候，清理定时侦听
            if (this.mode === 'Lazy' && this.events.length === 0) {
                this.clearWorkTask();
            }
        }
    }
}

/**
 * 定时任务
 */
export default WorkTask